package com.jeomo.mem.starter.service;

import com.jeomo.base.starter.service.IBaseService;
import com.jeomo.mem.starter.dto.MemberInfoDto;
import com.jeomo.mem.starter.entity.Member;
import com.jeomo.mem.starter.entity.MemberCard;
import com.jeomo.mem.starter.entity.MemberConsumeDetail;
import com.jeomo.mem.starter.entity.MemberPointsUpdate;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 会员库服务
 *
 * @author Jackpot
 * @since 2020-10-22
 */
public interface IMemberCardService extends IBaseService<MemberCard> {

    /**
     * 注册会员卡
     * @param memberInfoDto
     * @return
     */
	int registerMemberCard(MemberInfoDto memberInfoDto);

    /**
     * 查询会员基本信息
     * @param topOrg    顶级组织
     * @param phone
     * @return
     */
    Member queryMemberByPhone(String topOrg,String phone);


    /**
     * 查询会员卡和会员信息
     * @param org   组织
     * @param phone 手机号
     * @return
     */
    MemberCard queryMemCardByPhone(String org, String phone);

    /**
     *根据<手机号> 或 <会员卡号>查询会员信息(组织隔离)
     * @param org
     * @param number
     * @return
     */
    MemberCard queryMemCardByPhoneOrNo(String org, String number);

    /**
     * 查询会员卡和会员信息
     * @param cardNo    卡号
     * @return
     */
    MemberCard queryMemCardByNo(String cardNo);


    List<MemberCard> queryAllMemCards();

    /**
     * 修改会员卡状态
     * @param cardNo
     * @param status
     * @return
     */
    int updateCardStatus(String cardNo,String status);

    /**
     * 修改会员信息
     * @param member
     * @return
     */
    int updateMemberInfo(Member member);

    /**
     * 会员积分变动<br/>
     *
     * 注意: 会员积分的变动应使用该接口统一更新，不应该单独更新积分执行单 或 积分明细；
     * @param memberPointsUpdate
     * @return
     */
    void updateMemberPoints(MemberPointsUpdate memberPointsUpdate);

    /**
     * 获取会员卡当前剩余积分
     * @param cardNo
     * @return
     */
    int getCurrPoints(String cardNo);

    /**
     * 获取会员卡截止到指定时间的剩余积分
     * @param cardNo
     * @param date  截止时间
     * @return
     */
    int getPoints(String cardNo, LocalDate date);

    /**
     * 记录消费明细
     * @param memberConsumeDetail
     */
    void recordConsumeDetail(MemberConsumeDetail memberConsumeDetail);
}
